
#include <memory>

// 测试 基类析构函数为保护型，可以创建子类对象，不能创建局部类型的基类对象（自动析构）或主动对基类调用delete
class B {
protected:
    virtual ~B(){}
};

class D :public B{};

std::shared_ptr<B> GenProduct(){
    //这只是个实例，真正要控制对象的创建，应该在构造函数上做文章，如 test_protected_constructor.cpp 做了初步测试
    class C :public B{};
    std::shared_ptr<B> ret = std::make_shared<C>();
    return ret;
}

int main()
{
    //B bObj;error C2248: “B::~B”: 无法访问 protected 成员(在“B”类中声明)
    B* pb = new B;
    //delete pb;// error C2248 : “B::~B” : 无法访问 protected 成员(在“B”类中声明)

    //auto sptr_b = std::make_shared<B>();
    // /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator.h:176:87: error: '~B' is a protected member of 'B'

    auto sptr_b = std::make_shared<D>();

    D dObj; //没问题正常编译
    
    return 0;
}
